4: 서울 종합병원 분포 확인하기

부스트코스
Author

김보람

Published

November 24, 2022

공공데이터 상권정보 분석해보기

필요한 라이브러리 불러오기

import pandas as pd
import numpy as np
import seaborn as sns

시각화를 위한 폰트 설정

# ctrl(cmd) + / : 주석처리를 풀었다 했다 

import matplotlib.pyplot as plt
 # window의 한글 폰트 설정
plt.rc('font',family='Malgun Gothic') #윈도우의 경우

# plt.rc('font', family='AppleGothic') #맥의 경우

plt.rc('axes', unicode_minus=False) #마이너스 폰트 깨지는 것 대비

# 그래프가 노트북 안에 보이게 하기 위해
%matplotlib inline
from IPython.display import set_matplotlib_formats
#폰트가 선명하게 보이기 위해

%config InlineBackend.figure_format = 'retina'

데이터 로드하기

!move "C:\Users\user\Downloads\소상공인시장진흥공단_상가업소정보_의료기관_201909.csv"
지정된 파일을 찾을 수 없습니다.
df = pd.read_csv("data/소상공인시장진흥공단_상가업소정보_의료기관_201909.csv", low_memory=False)
# low_memory=False로 설정이 되어야 한다. 안그럼 오류남.
df.shape # 데이터의 행과 열 크기를 찍어볼 수 있따
(91335, 39)

데이터 미리보기

  • head, tail을 통해 데이터를 미리 볼수 있따
# shift + tab 키를 누르면 docstring을 볼 수 있다
# head: 데이터 미리보기
df.head(1)
상가업소번호 상호명 지점명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 표준산업분류코드 ... 건물관리번호 건물명 도로명주소 구우편번호 신우편번호 동정보 층정보 호정보 경도 위도
0 19956873 하나산부인과 NaN S 의료 S01 병원 S01B10 산부인과 Q86201 ... 4127310900110810000010857 산호한양아파트 경기도 안산시 단원구 달미로 10 425764.0 15236.0 NaN NaN NaN 126.814295 37.336344

1 rows × 39 columns

# tail: 마지막 데이터 불러오기
df.tail(1)
상가업소번호 상호명 지점명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 표준산업분류코드 ... 건물관리번호 건물명 도로명주소 구우편번호 신우편번호 동정보 층정보 호정보 경도 위도
91334 16109073 천안김안과천안역본점의원 NaN S 의료 S01 병원 S01B13 안과의원 Q86201 ... 4413110700102660017016314 김안과 충청남도 천안시 동남구 중앙로 92 330952.0 31127.0 NaN NaN NaN 127.152651 36.80664

1 rows × 39 columns

데이터 요약하기

요약정보

# 요약정보가 나타난다
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 91335 entries, 0 to 91334
Data columns (total 39 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   상가업소번호     91335 non-null  int64  
 1   상호명        91335 non-null  object 
 2   지점명        1346 non-null   object 
 3   상권업종대분류코드  91335 non-null  object 
 4   상권업종대분류명   91335 non-null  object 
 5   상권업종중분류코드  91335 non-null  object 
 6   상권업종중분류명   91335 non-null  object 
 7   상권업종소분류코드  91335 non-null  object 
 8   상권업종소분류명   91335 non-null  object 
 9   표준산업분류코드   86413 non-null  object 
 10  표준산업분류명    86413 non-null  object 
 11  시도코드       90956 non-null  float64
 12  시도명        90956 non-null  object 
 13  시군구코드      90956 non-null  float64
 14  시군구명       90956 non-null  object 
 15  행정동코드      91335 non-null  int64  
 16  행정동명       90956 non-null  object 
 17  법정동코드      91280 non-null  float64
 18  법정동명       91280 non-null  object 
 19  지번코드       91335 non-null  int64  
 20  대지구분코드     91335 non-null  int64  
 21  대지구분명      91335 non-null  object 
 22  지번본번지      91335 non-null  int64  
 23  지번부번지      72079 non-null  float64
 24  지번주소       91335 non-null  object 
 25  도로명코드      91335 non-null  int64  
 26  도로명        91335 non-null  object 
 27  건물본번지      91335 non-null  int64  
 28  건물부번지      10604 non-null  float64
 29  건물관리번호     91335 non-null  object 
 30  건물명        46453 non-null  object 
 31  도로명주소      91335 non-null  object 
 32  구우편번호      91323 non-null  float64
 33  신우편번호      91333 non-null  float64
 34  동정보        7406 non-null   object 
 35  층정보        44044 non-null  object 
 36  호정보        15551 non-null  object 
 37  경도         91335 non-null  float64
 38  위도         91335 non-null  float64
dtypes: float64(9), int64(7), object(23)
memory usage: 27.2+ MB
# object : 문자열로 된 데이터 타입
# int: 정수형
# float : 실수형

컬럼명보기

# 컬럼명만 추출해보기
df.columns
Index(['상가업소번호', '상호명', '지점명', '상권업종대분류코드', '상권업종대분류명', '상권업종중분류코드',
       '상권업종중분류명', '상권업종소분류코드', '상권업종소분류명', '표준산업분류코드', '표준산업분류명', '시도코드',
       '시도명', '시군구코드', '시군구명', '행정동코드', '행정동명', '법정동코드', '법정동명', '지번코드',
       '대지구분코드', '대지구분명', '지번본번지', '지번부번지', '지번주소', '도로명코드', '도로명', '건물본번지',
       '건물부번지', '건물관리번호', '건물명', '도로명주소', '구우편번호', '신우편번호', '동정보', '층정보',
       '호정보', '경도', '위도'],
      dtype='object')

데이터 타입

# 데이터 타입만 출력
df.dtypes
상가업소번호         int64
상호명           object
지점명           object
상권업종대분류코드     object
상권업종대분류명      object
상권업종중분류코드     object
상권업종중분류명      object
상권업종소분류코드     object
상권업종소분류명      object
표준산업분류코드      object
표준산업분류명       object
시도코드         float64
시도명           object
시군구코드        float64
시군구명          object
행정동코드          int64
행정동명          object
법정동코드        float64
법정동명          object
지번코드           int64
대지구분코드         int64
대지구분명         object
지번본번지          int64
지번부번지        float64
지번주소          object
도로명코드          int64
도로명           object
건물본번지          int64
건물부번지        float64
건물관리번호        object
건물명           object
도로명주소         object
구우편번호        float64
신우편번호        float64
동정보           object
층정보           object
호정보           object
경도           float64
위도           float64
dtype: object

결측치

df.isnull()
# true로 표시되는 값은 null 값! 
상가업소번호 상호명 지점명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 표준산업분류코드 ... 건물관리번호 건물명 도로명주소 구우편번호 신우편번호 동정보 층정보 호정보 경도 위도
0 False False True False False False False False False False ... False False False False False True True True False False
1 False False True False False False False False False False ... False True False False False True False True False False
2 False False True False False False False False False False ... False False False False False True True True False False
3 False False True False False False False False False True ... False True False False False True False True False False
4 False False False False False False False False False False ... False True False False False True False True False False
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
91330 False False False False False False False False False False ... False True False False False True True True False False
91331 False False False False False False False False False False ... False False False False False True True True False False
91332 False False True False False False False False False False ... False False False False False True False True False False
91333 False False True False False False False False False False ... False True False False False True True True False False
91334 False False True False False False False False False False ... False False False False False True True True False False

91335 rows × 39 columns

null_count = df.isnull().sum()
null_count
상가업소번호           0
상호명              0
지점명          89989
상권업종대분류코드        0
상권업종대분류명         0
상권업종중분류코드        0
상권업종중분류명         0
상권업종소분류코드        0
상권업종소분류명         0
표준산업분류코드      4922
표준산업분류명       4922
시도코드           379
시도명            379
시군구코드          379
시군구명           379
행정동코드            0
행정동명           379
법정동코드           55
법정동명            55
지번코드             0
대지구분코드           0
대지구분명            0
지번본번지            0
지번부번지        19256
지번주소             0
도로명코드            0
도로명              0
건물본번지            0
건물부번지        80731
건물관리번호           0
건물명          44882
도로명주소            0
구우편번호           12
신우편번호            2
동정보          83929
층정보          47291
호정보          75784
경도               0
위도               0
dtype: int64
# 결측치를 막대그래프로 표현
null_count.plot() # 선그래프로 표시되는데.. 적합하지 않은 거 같아!

null_count.plot.bar(rot=60)
# rot = 글자 돌려보는것

null_count.plot.barh()

null_count.plot.barh(figsize=(5,7)) # 그래프 사이즈 지정

# 위에서 계산한 결측치 수를 reset_index 통해 데이터 프레임으로 만들기
# df_null_coount 변수에 결과를 담아 head로 미리보기 해보기

df_null_count = null_count.reset_index()
df_null_count.head()
index 0
0 상가업소번호 0
1 상호명 0
2 지점명 89989
3 상권업종대분류코드 0
4 상권업종대분류명 0

컬럼명 변경하기

# 변수에 담겨있는 컬럼이름 변경

df_null_count.columns = ["컬럼명", "결측치수"]
df_null_count.head()
컬럼명 결측치수
0 상가업소번호 0
1 상호명 0
2 지점명 89989
3 상권업종대분류코드 0
4 상권업종대분류명 0

정렬하기

# sort_values 통해 정렬
# 결측치가 많은 순으로 상위 10개 출력

df_null_count_top = df_null_count.sort_values(by="결측치수", ascending=False).head(10)
df_null_count_top 
컬럼명 결측치수
2 지점명 89989
34 동정보 83929
28 건물부번지 80731
36 호정보 75784
35 층정보 47291
30 건물명 44882
23 지번부번지 19256
9 표준산업분류코드 4922
10 표준산업분류명 4922
11 시도코드 379

특정 컬럼만 불러오기

# 지점명 컬럼 불러오기
# NaN == Not a Number의 약자로 결측치를 의미한다.

df["지점명"].head()
0    NaN
1    NaN
2    NaN
3    NaN
4    수지점
Name: 지점명, dtype: object
# "컬럼명" 이라는 컬럼 값만 가져와서 drop_columns 라는 변수에 담기

drop_columns = df_null_count_top["컬럼명"].tolist()    # tolist : list로 만들어줌
drop_columns 
['지점명',
 '동정보',
 '건물부번지',
 '호정보',
 '층정보',
 '건물명',
 '지번부번지',
 '표준산업분류코드',
 '표준산업분류명',
 '시도코드']
# drop_columns 변수로 해당 컬럼 정보만 데이터프레임에서 가져오기
df[drop_columns].head()
지점명 동정보 건물부번지 호정보 층정보 건물명 지번부번지 표준산업분류코드 표준산업분류명 시도코드
0 NaN NaN NaN NaN NaN 산호한양아파트 NaN Q86201 일반 의원 41.0
1 NaN NaN NaN NaN 4 NaN 14.0 Q86201 일반 의원 11.0
2 NaN NaN NaN NaN NaN 한라프라자 1.0 Q86201 일반 의원 41.0
3 NaN NaN NaN NaN 5 NaN 1.0 NaN NaN 26.0
4 수지점 NaN NaN NaN 1 NaN 2.0 G47811 의약품 및 의료용품 소매업 41.0

제거하기

print(df.shape)

df = df.drop(drop_columns, axis=1) 
# axis=1 컬럼기준으로 drop axis > 행(0), 열 (1)

print(df.shape)
(91335, 39)
(91335, 29)
# 제거 결과 info로 확인
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 91335 entries, 0 to 91334
Data columns (total 29 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   상가업소번호     91335 non-null  int64  
 1   상호명        91335 non-null  object 
 2   상권업종대분류코드  91335 non-null  object 
 3   상권업종대분류명   91335 non-null  object 
 4   상권업종중분류코드  91335 non-null  object 
 5   상권업종중분류명   91335 non-null  object 
 6   상권업종소분류코드  91335 non-null  object 
 7   상권업종소분류명   91335 non-null  object 
 8   시도명        90956 non-null  object 
 9   시군구코드      90956 non-null  float64
 10  시군구명       90956 non-null  object 
 11  행정동코드      91335 non-null  int64  
 12  행정동명       90956 non-null  object 
 13  법정동코드      91280 non-null  float64
 14  법정동명       91280 non-null  object 
 15  지번코드       91335 non-null  int64  
 16  대지구분코드     91335 non-null  int64  
 17  대지구분명      91335 non-null  object 
 18  지번본번지      91335 non-null  int64  
 19  지번주소       91335 non-null  object 
 20  도로명코드      91335 non-null  int64  
 21  도로명        91335 non-null  object 
 22  건물본번지      91335 non-null  int64  
 23  건물관리번호     91335 non-null  object 
 24  도로명주소      91335 non-null  object 
 25  구우편번호      91323 non-null  float64
 26  신우편번호      91333 non-null  float64
 27  경도         91335 non-null  float64
 28  위도         91335 non-null  float64
dtypes: float64(6), int64(7), object(16)
memory usage: 20.2+ MB

기초 통계값 보기

기초 통계 수치


df.dtypes
상가업소번호         int64
상호명           object
상권업종대분류코드     object
상권업종대분류명      object
상권업종중분류코드     object
상권업종중분류명      object
상권업종소분류코드     object
상권업종소분류명      object
시도명           object
시군구코드        float64
시군구명          object
행정동코드          int64
행정동명          object
법정동코드        float64
법정동명          object
지번코드           int64
대지구분코드         int64
대지구분명         object
지번본번지          int64
지번주소          object
도로명코드          int64
도로명           object
건물본번지          int64
건물관리번호        object
도로명주소         object
구우편번호        float64
신우편번호        float64
경도           float64
위도           float64
dtype: object
#평균값
df["위도"].mean()
36.62471119236673
# 중앙값
df["위도"].median()
37.2346523177033
# 최댓값
df["위도"].max()
38.4996585705598
# 최솟값
df["위도"].min()
33.2192896688307
# 갯수
df["위도"].count()
91335

기초통계값 요약하기 - describe

데이터를 요약해서 볼 수 있음

# 위도를 descibe로 요약

df["위도"].describe()
count    91335.000000
mean        36.624711
std          1.041361
min         33.219290
25%         35.811830
50%         37.234652
75%         37.507463
max         38.499659
Name: 위도, dtype: float64
# 2개의 컬럼을 describe로 요약
df["위도", "경도"] 

# pandas에서는 리스트 형태로 가져와야한다. 위와 같이 하면 오류남
KeyError: ('위도', '경도')
df[["위도", "경도"]]
위도 경도
0 37.336344 126.814295
1 37.488742 127.053198
2 37.344955 126.734841
3 35.166872 129.115438
4 37.323528 127.095522
... ... ...
91330 36.352728 127.389865
91331 37.627530 126.830144
91332 35.227138 129.082790
91333 37.540993 127.143958
91334 36.806640 127.152651

91335 rows × 2 columns

df[["위도", "경도"]].describe()
위도 경도
count 91335.000000 91335.000000
mean 36.624711 127.487524
std 1.041361 0.842877
min 33.219290 124.717632
25% 35.811830 126.914297
50% 37.234652 127.084550
75% 37.507463 128.108919
max 38.499659 130.909912
# describe로 문자열 데이터타입 요약

df.describe() # 기본값은 수치형으로 되어있음!
상가업소번호 시군구코드 행정동코드 법정동코드 지번코드 대지구분코드 지번본번지 도로명코드 건물본번지 구우편번호 신우편번호 경도 위도
count 9.133500e+04 90956.000000 9.133500e+04 9.128000e+04 9.133500e+04 91335.000000 91335.000000 9.133500e+04 91335.000000 91323.000000 91333.00000 91335.000000 91335.000000
mean 2.121818e+07 32898.381877 3.293232e+09 3.293385e+09 3.293191e+18 1.001336 587.534549 3.293207e+11 251.200482 428432.911085 28085.47698 127.487524 36.624711
std 5.042828e+06 12985.393171 1.297387e+09 1.297706e+09 1.297393e+18 0.036524 582.519364 1.297391e+11 477.456487 193292.339066 18909.01455 0.842877 1.041361
min 2.901108e+06 11110.000000 1.111052e+09 1.111010e+09 1.111010e+18 1.000000 1.000000 1.111020e+11 0.000000 100011.000000 1000.00000 124.717632 33.219290
25% 2.001931e+07 26350.000000 2.635065e+09 2.635011e+09 2.635011e+18 1.000000 162.000000 2.635042e+11 29.000000 302120.000000 11681.00000 126.914297 35.811830
50% 2.211900e+07 41117.000000 4.111758e+09 4.111710e+09 4.111711e+18 1.000000 462.000000 4.111743e+11 92.000000 440300.000000 24353.00000 127.084550 37.234652
75% 2.480984e+07 43113.000000 4.311370e+09 4.311311e+09 4.311311e+18 1.000000 858.000000 4.311332e+11 257.000000 602811.000000 46044.00000 128.108919 37.507463
max 2.852470e+07 50130.000000 5.013061e+09 5.013032e+09 5.013061e+18 2.000000 7338.000000 5.013049e+11 8795.000000 799801.000000 63643.00000 130.909912 38.499659
df.describe(include="object")

# top : 가장 많이 나타난걸 보여줌
# freq : frequency : 빈도수.. 리원이라는 상호명이 152번 등장한다.
# 결측치는 제외하고 보여줌! 
상호명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 시도명 시군구명 행정동명 법정동명 대지구분명 지번주소 도로명 건물관리번호 도로명주소
count 91335 91335 91335 91335 91335 91335 91335 90956 90956 90956 91280 91335 91335 91335 91335 91335
unique 56910 1 1 5 5 34 34 17 228 2791 2822 2 53118 16610 54142 54031
top 리원 S 의료 S01 병원 S02A01 약국 경기도 서구 중앙동 중동 대지 서울특별시 동대문구 제기동 965-1 서울특별시 강남구 강남대로 1123010300109650001031604 서울특별시 동대문구 약령중앙로8길 10
freq 152 91335 91335 60774 60774 18964 18964 21374 3165 1856 874 91213 198 326 198 198
# 모든 데이터 요약
df.describe(include="all")
상가업소번호 상호명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 시도명 시군구코드 ... 지번주소 도로명코드 도로명 건물본번지 건물관리번호 도로명주소 구우편번호 신우편번호 경도 위도
count 9.133500e+04 91335 91335 91335 91335 91335 91335 91335 90956 90956.000000 ... 91335 9.133500e+04 91335 91335.000000 91335 91335 91323.000000 91333.00000 91335.000000 91335.000000
unique NaN 56910 1 1 5 5 34 34 17 NaN ... 53118 NaN 16610 NaN 54142 54031 NaN NaN NaN NaN
top NaN 리원 S 의료 S01 병원 S02A01 약국 경기도 NaN ... 서울특별시 동대문구 제기동 965-1 NaN 서울특별시 강남구 강남대로 NaN 1123010300109650001031604 서울특별시 동대문구 약령중앙로8길 10 NaN NaN NaN NaN
freq NaN 152 91335 91335 60774 60774 18964 18964 21374 NaN ... 198 NaN 326 NaN 198 198 NaN NaN NaN NaN
mean 2.121818e+07 NaN NaN NaN NaN NaN NaN NaN NaN 32898.381877 ... NaN 3.293207e+11 NaN 251.200482 NaN NaN 428432.911085 28085.47698 127.487524 36.624711
std 5.042828e+06 NaN NaN NaN NaN NaN NaN NaN NaN 12985.393171 ... NaN 1.297391e+11 NaN 477.456487 NaN NaN 193292.339066 18909.01455 0.842877 1.041361
min 2.901108e+06 NaN NaN NaN NaN NaN NaN NaN NaN 11110.000000 ... NaN 1.111020e+11 NaN 0.000000 NaN NaN 100011.000000 1000.00000 124.717632 33.219290
25% 2.001931e+07 NaN NaN NaN NaN NaN NaN NaN NaN 26350.000000 ... NaN 2.635042e+11 NaN 29.000000 NaN NaN 302120.000000 11681.00000 126.914297 35.811830
50% 2.211900e+07 NaN NaN NaN NaN NaN NaN NaN NaN 41117.000000 ... NaN 4.111743e+11 NaN 92.000000 NaN NaN 440300.000000 24353.00000 127.084550 37.234652
75% 2.480984e+07 NaN NaN NaN NaN NaN NaN NaN NaN 43113.000000 ... NaN 4.311332e+11 NaN 257.000000 NaN NaN 602811.000000 46044.00000 128.108919 37.507463
max 2.852470e+07 NaN NaN NaN NaN NaN NaN NaN NaN 50130.000000 ... NaN 5.013049e+11 NaN 8795.000000 NaN NaN 799801.000000 63643.00000 130.909912 38.499659

11 rows × 29 columns

중복제거한 값 보기

  • unique로 중복 제거 nuique 갯수 세기
# 상권업종대분류명

df["상권업종대분류명"].unique()
array(['의료'], dtype=object)
df["상권업종대분류명"].nunique()
1
# 상권업종중분류명
df["상권업종중분류명"].unique()
array(['병원', '약국/한약방', '수의업', '유사의료업', '의료관련서비스업'], dtype=object)
df["상권업종중분류명"].nunique()
5
# 상권업종소분류명
df["상권업종소분류명"].unique()
array(['산부인과', '내과/외과', '신경외과', '기타병원', '약국', '동물병원', '한약방', '탕제원',
       '정형/성형외과', '소아과', '이비인후과의원', '노인/치매병원', '언어치료', '수의업-종합', '한의원',
       '치과의원', '침구원', '일반병원', '안과의원', '조산원', '한방병원', '종합병원', '유사의료업기타',
       '응급구조대', '혈액원', '치과병원', '척추교정치료', '피부과', '비뇨기과', '치과기공소', '산후조리원',
       '접골원', '수의업-기타', '제대혈'], dtype=object)
df["상권업종소분류명"].nunique()
34
len(df["상권업종소분류명"].unique())
34

그룹화된 요약값 보기 - value_counts

  • 카테고리 형태의 데이터 갯수를 셀 수 있다.
# 시도코드 세어보기 -> 결측치...
df["시도명"].head()
0      경기도
1    서울특별시
2      경기도
3    부산광역시
4      경기도
Name: 시도명, dtype: object
# 시도명 세보면
city = df["시도명"].value_counts()
city
경기도        21374
서울특별시      18943
부산광역시       6473
경상남도        4973
인천광역시       4722
대구광역시       4597
경상북도        4141
전라북도        3894
충청남도        3578
전라남도        3224
광주광역시       3214
대전광역시       3067
충청북도        2677
강원도         2634
울산광역시       1997
제주특별자치도     1095
세종특별자치시      353
Name: 시도명, dtype: int64
# normalize=True 옵션 사용시 비율을 구할 수 있다.

city_normalize= df["시도명"].value_counts(normalize=True)
city_normalize
경기도        0.234993
서울특별시      0.208266
부산광역시      0.071166
경상남도       0.054675
인천광역시      0.051915
대구광역시      0.050541
경상북도       0.045528
전라북도       0.042812
충청남도       0.039338
전라남도       0.035446
광주광역시      0.035336
대전광역시      0.033720
충청북도       0.029432
강원도        0.028959
울산광역시      0.021956
제주특별자치도    0.012039
세종특별자치시    0.003881
Name: 시도명, dtype: float64
city.plot()

 # 막대그래프 표현
city.plot.barh()

# plto.pie() 사용하여 파이그래프 그리기
city_normalize.plot.pie(figsize=(7,7))

# seaborn의 countplot 그리기
sns.countplot(data=df, y="시도명" )

c=sns.countplot(data=df, y="시도명" ) 
# 변수명에 담아주면 밑에 글씨가 없어진당 

df["상권업종대분류명"].value_counts()
의료    91335
Name: 상권업종대분류명, dtype: int64
d= df["상권업종중분류명"].value_counts()
d
병원          60774
약국/한약방      20923
수의업          5323
유사의료업        3774
의료관련서비스업      541
Name: 상권업종중분류명, dtype: int64
n =df["상권업종중분류명"].value_counts(normalize=True)
n
병원          0.665397
약국/한약방      0.229080
수의업         0.058280
유사의료업       0.041320
의료관련서비스업    0.005923
Name: 상권업종중분류명, dtype: float64
d.plot()

d.plot.bar()

d.plot.bar(rot=0) # x축 레이블 값 회전

n.plot.pie()

c = df["상권업종소분류명"].value_counts()
c
약국         18964
치과의원       13731
한의원        13211
내과/외과      11374
기타병원        4922
일반병원        3385
동물병원        3098
정형/성형외과     2562
소아과         2472
수의업-종합      2216
치과기공소       1724
이비인후과의원     1486
한약방         1442
피부과         1273
산부인과        1116
노인/치매병원     1055
안과의원        1042
비뇨기과         809
종합병원         762
치과병원         756
언어치료         664
유사의료업기타      629
탕제원          517
산후조리원        511
신경외과         421
한방병원         397
척추교정치료       338
침구원          154
혈액원          130
응급구조대        125
조산원           30
접골원            9
수의업-기타         9
제대혈            1
Name: 상권업종소분류명, dtype: int64
c.plot.barh(figsize=(7, 8), grid= True) #gird: 격자 표시

데이터 색인하기

# 상권업종분류명이 약국/한약방인 데이터만 가져와서
# df_medical이라는 변수에 담고
# head()통해 미리보기

df_medical = df[df["상권업종중분류명"] == "약국/한약방"].copy()
df_medical.head(1)
상가업소번호 상호명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 시도명 시군구코드 ... 지번주소 도로명코드 도로명 건물본번지 건물관리번호 도로명주소 구우편번호 신우편번호 경도 위도
4 20364049 더블유스토어수지점 S 의료 S02 약국/한약방 S02A01 약국 경기도 41465.0 ... 경기도 용인시 수지구 풍덕천동 712-2 414653205024 경기도 용인시 수지구 문정로 32 4146510100107120002026238 경기도 용인시 수지구 문정로 32 448170.0 16837.0 127.095522 37.323528

1 rows × 29 columns

# 상권업종대분류명이 의료만 가져오기
# df.loc 사용하면 행, 열을 함께 가져온다.
# 이 기능을 통해 상권업종중뷴려망만 가져온다
# 가져온 결과를 value_counts를 통해 중분류의 갯수를 세본다.

df.loc[df["상권업종대분류명"] == "의료", "상권업종중분류명"].value_counts()
병원          60774
약국/한약방      20923
수의업          5323
유사의료업        3774
의료관련서비스업      541
Name: 상권업종중분류명, dtype: int64
# 위와 같은 기능을 수행하는 코드
# df.loc[df["상권업종대분류명"] == "의료"]["상권업종중분류명"] 근데 이건 느리다!! 
m = df["상권업종대분류명"] == "의료"
df.loc[m, "상권업종중분류명"].value_counts()
병원          60774
약국/한약방      20923
수의업          5323
유사의료업        3774
의료관련서비스업      541
Name: 상권업종중분류명, dtype: int64
# 유사의료업
df[df["상권업종중분류명"] == "유사의료업"]
상가업소번호 상호명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 시도명 시군구코드 ... 지번주소 도로명코드 도로명 건물본번지 건물관리번호 도로명주소 구우편번호 신우편번호 경도 위도
22 21013731 세종언어치료센터 S 의료 S03 유사의료업 S03B07 언어치료 부산광역시 26410.0 ... 부산광역시 금정구 구서동 84-1 264102000010 부산광역시 금정구 중앙대로 1817 2641010700100840001017686 부산광역시 금정구 중앙대로 1817-11 609310.0 46273.0 129.091662 35.246528
40 20933900 고려수지침학회 S 의료 S03 유사의료업 S03B03 침구원 경상남도 48123.0 ... 경상남도 창원시 성산구 상남동 5-2 481234784088 경상남도 창원시 성산구 마디미로4번길 9 4812312700100050002026799 경상남도 창원시 성산구 마디미로4번길 9 642832.0 51495.0 128.684678 35.224113
97 21717820 청명원 S 의료 S03 유사의료업 S03B09 유사의료업기타 충청북도 43760.0 ... 충청북도 괴산군 청안면 금신리 241 437604538132 충청북도 괴산군 청안면 금신로1길 93 4376037022102410000007293 충청북도 괴산군 청안면 금신로1길 93 367831.0 28050.0 127.635740 36.768935
102 21865854 응급환자이송센터 S 의료 S03 유사의료업 S03B01 응급구조대 대전광역시 30140.0 ... 대전광역시 중구 대사동 248-237 301404295026 대전광역시 중구 계룡로921번길 40 3014011000102480237013097 대전광역시 중구 계룡로921번길 40 301846.0 34946.0 127.417693 36.321801
108 21914637 태화아동발달지원센터 S 의료 S03 유사의료업 S03B07 언어치료 대전광역시 30140.0 ... 대전광역시 중구 문화동 27 301404295402 대전광역시 중구 보문산로333번길 29 3014011600100270000008172 대전광역시 중구 보문산로333번길 29 301130.0 35020.0 127.412725 36.312953
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
91300 16131218 으뜸치과기공소 S 의료 S03 유사의료업 S03B06 치과기공소 경상남도 48170.0 ... 경상남도 진주시 수정동 39-11 481704797625 경상남도 진주시 향교로18번길 8 4817011600100390011004490 경상남도 진주시 향교로18번길 8 660180.0 52753.0 128.084600 35.197029
91310 16199325 보령치과기공소 S 의료 S03 유사의료업 S03B06 치과기공소 서울특별시 11290.0 ... 서울특별시 성북구 동소문동4가 103-11 112903107003 서울특별시 성북구 동소문로 47 1129010700101030014050661 서울특별시 성북구 동소문로 47-15 136821.0 2832.0 127.010602 37.591455
91311 16199088 점프셈교실 S 의료 S03 유사의료업 S03B09 유사의료업기타 경상북도 47130.0 ... 경상북도 경주시 황성동 446 471304715895 경상북도 경주시 용담로104번길 16 4713012400104460000024894 경상북도 경주시 용담로104번길 16 780954.0 38084.0 129.211755 35.865600
91319 16108560 씨앤디자인치과기공소 S 의료 S03 유사의료업 S03B06 치과기공소 서울특별시 11545.0 ... 서울특별시 금천구 가산동 60-25 115453116013 서울특별시 금천구 벚꽃로 234 1154510100100600025000001 서울특별시 금천구 벚꽃로 234 153798.0 8513.0 126.886122 37.475986
91327 16190388 오피스알파 S 의료 S03 유사의료업 S03B06 치과기공소 경기도 41173.0 ... 경기도 안양시 동안구 호계동 970-24 411734349013 경기도 안양시 동안구 경수대로507번길 28 4117310400109700024005182 경기도 안양시 동안구 경수대로507번길 28 431849.0 14120.0 126.956365 37.367779

3774 rows × 29 columns


df[df["상권업종중분류명"] == "유사의료업"].shape
(3774, 29)
# 상호명 그룹화해서 갯수
# value_counts를 사용해 상위 10개 출력

df["상호명"].value_counts().head(10)
리원       152
온누리약국    149
경희한의원    141
우리약국     119
중앙약국     111
전자담배      98
조은약국      95
건강약국      87
제일약국      79
사랑약국      73
Name: 상호명, dtype: int64

df["상호명"].value_counts().tail()
메리디언치과          1
이엘피부과성형외과       1
금오중국한의원         1
오케이연합의원         1
천안김안과천안역본점의원    1
Name: 상호명, dtype: int64

df_medi = df[df["상권업종중분류명"] == "유사의료업"]
df_medi
상가업소번호 상호명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 시도명 시군구코드 ... 지번주소 도로명코드 도로명 건물본번지 건물관리번호 도로명주소 구우편번호 신우편번호 경도 위도
22 21013731 세종언어치료센터 S 의료 S03 유사의료업 S03B07 언어치료 부산광역시 26410.0 ... 부산광역시 금정구 구서동 84-1 264102000010 부산광역시 금정구 중앙대로 1817 2641010700100840001017686 부산광역시 금정구 중앙대로 1817-11 609310.0 46273.0 129.091662 35.246528
40 20933900 고려수지침학회 S 의료 S03 유사의료업 S03B03 침구원 경상남도 48123.0 ... 경상남도 창원시 성산구 상남동 5-2 481234784088 경상남도 창원시 성산구 마디미로4번길 9 4812312700100050002026799 경상남도 창원시 성산구 마디미로4번길 9 642832.0 51495.0 128.684678 35.224113
97 21717820 청명원 S 의료 S03 유사의료업 S03B09 유사의료업기타 충청북도 43760.0 ... 충청북도 괴산군 청안면 금신리 241 437604538132 충청북도 괴산군 청안면 금신로1길 93 4376037022102410000007293 충청북도 괴산군 청안면 금신로1길 93 367831.0 28050.0 127.635740 36.768935
102 21865854 응급환자이송센터 S 의료 S03 유사의료업 S03B01 응급구조대 대전광역시 30140.0 ... 대전광역시 중구 대사동 248-237 301404295026 대전광역시 중구 계룡로921번길 40 3014011000102480237013097 대전광역시 중구 계룡로921번길 40 301846.0 34946.0 127.417693 36.321801
108 21914637 태화아동발달지원센터 S 의료 S03 유사의료업 S03B07 언어치료 대전광역시 30140.0 ... 대전광역시 중구 문화동 27 301404295402 대전광역시 중구 보문산로333번길 29 3014011600100270000008172 대전광역시 중구 보문산로333번길 29 301130.0 35020.0 127.412725 36.312953
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
91300 16131218 으뜸치과기공소 S 의료 S03 유사의료업 S03B06 치과기공소 경상남도 48170.0 ... 경상남도 진주시 수정동 39-11 481704797625 경상남도 진주시 향교로18번길 8 4817011600100390011004490 경상남도 진주시 향교로18번길 8 660180.0 52753.0 128.084600 35.197029
91310 16199325 보령치과기공소 S 의료 S03 유사의료업 S03B06 치과기공소 서울특별시 11290.0 ... 서울특별시 성북구 동소문동4가 103-11 112903107003 서울특별시 성북구 동소문로 47 1129010700101030014050661 서울특별시 성북구 동소문로 47-15 136821.0 2832.0 127.010602 37.591455
91311 16199088 점프셈교실 S 의료 S03 유사의료업 S03B09 유사의료업기타 경상북도 47130.0 ... 경상북도 경주시 황성동 446 471304715895 경상북도 경주시 용담로104번길 16 4713012400104460000024894 경상북도 경주시 용담로104번길 16 780954.0 38084.0 129.211755 35.865600
91319 16108560 씨앤디자인치과기공소 S 의료 S03 유사의료업 S03B06 치과기공소 서울특별시 11545.0 ... 서울특별시 금천구 가산동 60-25 115453116013 서울특별시 금천구 벚꽃로 234 1154510100100600025000001 서울특별시 금천구 벚꽃로 234 153798.0 8513.0 126.886122 37.475986
91327 16190388 오피스알파 S 의료 S03 유사의료업 S03B06 치과기공소 경기도 41173.0 ... 경기도 안양시 동안구 호계동 970-24 411734349013 경기도 안양시 동안구 경수대로507번길 28 4117310400109700024005182 경기도 안양시 동안구 경수대로507번길 28 431849.0 14120.0 126.956365 37.367779

3774 rows × 29 columns

df_medi["상호명"].value_counts().head(10)
리원          32
고려수지침       22
대한적십자사      17
헌혈의집        12
고려수지침학회     10
수치과기공소      10
제일치과기공소      9
미소치과기공소      8
아트치과기공소      8
이사랑치과기공소     8
Name: 상호명, dtype: int64

여러 조건으로 색인하기

# 상권업종소분류명이 약국이고 시도명이 서울특별시인 데이터
df["상권업종소분류명"] == "약국"  and df["시도명"] == "서울특별시"
# 오류! 판다스에서는 & 써야함. 
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

df["상권업종소분류명"] == "약국"  & df["시도명"] == "서울특별시"
# 오류! 연산자 우선순위 때문에 오류가 났다.
TypeError: Cannot perform 'rand_' with a dtyped [object] array and scalar of type [bool]

df_seoul_drug = df[(df["상권업종소분류명"] == "약국")  & (df["시도명"] == "서울특별시")]
print(df_seoul_drug.shape)
df_seoul_drug.head(1)
(3579, 29)
상가업소번호 상호명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 시도명 시군구코드 ... 지번주소 도로명코드 도로명 건물본번지 건물관리번호 도로명주소 구우편번호 신우편번호 경도 위도
33 20816709 이즈타워약 S 의료 S02 약국/한약방 S02A01 약국 서울특별시 11680.0 ... 서울특별시 강남구 역삼동 821 116803122010 서울특별시 강남구 테헤란로 101 1168010100108210001000001 서울특별시 강남구 테헤란로 101 135080.0 6134.0 127.028023 37.498656

1 rows × 29 columns

구별로 보기

# 시군구명으로 그룹화해서 갯수 세어보기
# 구별로 약국이 몇개가 있는지 확인
c = df_seoul_drug["시군구명"].value_counts()
c.head()
강남구     374
동대문구    261
광진구     212
서초구     191
송파구     188
Name: 시군구명, dtype: int64
n = df_seoul_drug["시군구명"].value_counts(normalize=True)
n.head()
강남구     0.104498
동대문구    0.072925
광진구     0.059234
서초구     0.053367
송파구     0.052529
Name: 시군구명, dtype: float64
c.plot.bar(rot=60) #rot:글씨를 기울인다

# 상권업종소분류명이 종합병원
# 시도명이 서울특별시인 데이터

df_seoul_hospital = df[(df["상권업종소분류명"] == "종합병원") & (df["시도명"] == "서울특별시")].copy()
# copy를 해줘야 df_soeul_hospital 이 바뀐다. df까지 바뀌지 않는다. 
df_seoul_hospital
상가업소번호 상호명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 시도명 시군구코드 ... 지번주소 도로명코드 도로명 건물본번지 건물관리번호 도로명주소 구우편번호 신우편번호 경도 위도
305 25155642 대진의료재단 S 의료 S01 병원 S01B01 종합병원 서울특별시 11215.0 ... 서울특별시 광진구 중곡동 58-25 112153104006 서울특별시 광진구 긴고랑로 119 1121510100100580025000733 서울특별시 광진구 긴고랑로 119 143220.0 4944.0 127.088279 37.559048
353 20471487 홍익병원별관 S 의료 S01 병원 S01B01 종합병원 서울특별시 11470.0 ... 서울특별시 양천구 신정동 897-13 114702005008 서울특별시 양천구 국회대로 250 1147010100108970013001044 서울특별시 양천구 국회대로 250 158070.0 7937.0 126.862805 37.529213
385 20737057 SNUH S 의료 S01 병원 S01B01 종합병원 서울특별시 11680.0 ... 서울특별시 강남구 역삼동 736-55 116804166727 서울특별시 강남구 테헤란로26길 10 1168010100107360055027688 서울특별시 강남구 테헤란로26길 10 135080.0 6236.0 127.035825 37.499630
1917 23210677 평화드림여의도성모병원의료기매장 S 의료 S01 병원 S01B01 종합병원 서울특별시 11560.0 ... 서울특별시 영등포구 여의도동 62 115603118001 서울특별시 영등포구 63로 10 1156011000100620000031477 서울특별시 영등포구 63로 10 150713.0 7345.0 126.936693 37.518296
2461 20024045 한양 S 의료 S01 병원 S01B01 종합병원 서울특별시 11200.0 ... 서울특별시 성동구 행당동 15-1 112003103002 서울특별시 성동구 마조로 22 1120010700100150001019623 서울특별시 성동구 마조로 22-2 133070.0 4763.0 127.041325 37.559469
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
71991 28505952 서울성모병원응급의료센터 S 의료 S01 병원 S01B01 종합병원 서울특별시 11650.0 ... 서울특별시 서초구 반포동 505 116502121003 서울특별시 서초구 반포대로 222 1165010700101230000017226 서울특별시 서초구 반포대로 222 137701.0 6591.0 127.005841 37.502382
76508 12292992 라마르의원 S 의료 S01 병원 S01B01 종합병원 서울특별시 11740.0 ... 서울특별시 강동구 천호동 453-8 117404172367 서울특별시 강동구 천호대로157길 18 1174010900104530021010314 서울특별시 강동구 천호대로157길 18 134864.0 5335.0 127.127466 37.538485
90492 16031909 가톨릭대학교여의도성모병원 S 의료 S01 병원 S01B01 종합병원 서울특별시 11140.0 ... 서울특별시 중구 명동2가 1-1 111404103165 서울특별시 중구 명동길 74 1114012700100010001019574 서울특별시 중구 명동길 74 100809.0 4537.0 126.986758 37.563662
90581 16332576 씨엠병원 S 의료 S01 병원 S01B01 종합병원 서울특별시 11560.0 ... 서울특별시 영등포구 영등포동4가 90 115604154717 서울특별시 영등포구 영등포로36길 13 1156010500100900000035097 서울특별시 영등포구 영등포로36길 13 150030.0 7301.0 126.903857 37.518807
90788 16162338 성베드로병원 S 의료 S01 병원 S01B01 종합병원 서울특별시 11680.0 ... 서울특별시 강남구 도곡동 910-27 116802000003 서울특별시 강남구 남부순환로 2649 1168011800109100027000895 서울특별시 강남구 남부순환로 2649 135859.0 6271.0 127.039567 37.485604

91 rows × 29 columns

df_seoul_hospital["시군구명"].value_counts()
강남구     15
영등포구     8
광진구      6
서초구      6
강동구      5
중구       5
송파구      5
강북구      4
도봉구      4
서대문구     4
양천구      4
성북구      3
강서구      2
중랑구      2
종로구      2
동대문구     2
구로구      2
노원구      2
금천구      2
성동구      2
관악구      2
동작구      1
마포구      1
용산구      1
은평구      1
Name: 시군구명, dtype: int64

텍스트 데이터 색인하기

# 색인 전 상호명 중에 종합병원이 아닌 데이터 찾기
df_seoul_hospital.loc[~df_seoul_hospital["상호명"].str.contains("종합병원"),"상호명"].unique()

# str.contains하면 특정 값만 찾을 수 있다. 
# 앞에 물결 표시를 하게 되면 종합병원이 안들어간 것만 찾을 수 있다. 
array(['대진의료재단', '홍익병원별관', 'SNUH', '평화드림여의도성모병원의료기매장', '한양', '백산의료재단친구병원',
       '서울보훈병원', '서울성모병원장례식장꽃배달', '서울대학교병원', '알콜중독및정신질환상담소',
       '강남성모병원장례식장꽃배달', '제일병원', '이랜드클리닉', '사랑나눔의료재단', '우울증센터', '성심의료재단',
       '다나의료재단', '서울아산병원신관', '원자력병원장례식장', '국민의원', '고려대학교구로병원', '학교법인일송학원',
       '삼성의료원장례식장', '희명스포츠의학센터인공신장실', '연세대학교의과대학강남세브란스', '국립정신병원',
       '코아클리닉', '수서제일의원', '사랑의의원', '한국전력공사부속한일병원', '신촌연세병원', '창동제일의원',
       '영동세브란스병원', '제일성심의원', '삼성의료재단강북삼성태', '서울시립보라매병원', '서울이의원',
       '서울대학교병원비상계획외래', '평화드림서울성모병원의료', '홍익병원', '사랑나눔의료재단서', '독일의원',
       '서울연합의원', '우신향병원', '동부제일병원', '아산재단금강병원', '명곡안연구소', '아산재단서울중앙병원',
       '메디힐특수여객', '삼성생명공익재단삼성서', '성광의료재단차병원', '한국건강관리협회서울특',
       '정해복지부설한신메디피아', '성베드로병원', '성애의료재단', '실로암의원', 'Y&T성모마취과', '광진성모의원',
       '서울현대의원', '이노신경과의원', '송정훼밀리의원', '서울중앙의원', '영남의료재단', '인제대학교서울백병원',
       '한국필의료재단', '세브란스의원', '가톨릭대학교성바오로병원장례식장', '서울연세의원', '사랑의병원',
       '성삼의료재단미즈메디병원', '씨엠충무병원', '성신의원', '원진재단부설녹색병원', '송파제일의원',
       '카톨릭성모의원', '한양성심의원', '관악성모의원', '강남센트럴병원', '우이한솔의원', '우리들병원',
       '서울성모병원어린이집', '건국대학교병원', '서울적십자병원', '북부성모의원', '한림대학교부속한강성심병원장례식장',
       '서울성모병원응급의료센터', '라마르의원', '가톨릭대학교여의도성모병원', '씨엠병원'], dtype=object)
df_seoul_hospital[df_seoul_hospital["상호명"].str.contains("꽃배달")]
상가업소번호 상호명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 시도명 시군구코드 ... 지번주소 도로명코드 도로명 건물본번지 건물관리번호 도로명주소 구우편번호 신우편번호 경도 위도
2803 20895655 서울성모병원장례식장꽃배달 S 의료 S01 병원 S01B01 종합병원 서울특별시 11650.0 ... 서울특별시 서초구 반포동 551 116504163330 서울특별시 서초구 사평대로28길 55 1165010700105510000017194 서울특별시 서초구 사평대로28길 55 137040.0 6578.0 127.000682 37.498257
4644 22020310 강남성모병원장례식장꽃배달 S 의료 S01 병원 S01B01 종합병원 서울특별시 11650.0 ... 서울특별시 서초구 반포동 547-6 116504163242 서울특별시 서초구 반포대로39길 56 1165010700105470006016762 서울특별시 서초구 반포대로39길 56-24 137040.0 6578.0 127.001756 37.499095

2 rows × 29 columns

df_seoul_hospital[df_seoul_hospital["상호명"].str.contains("의료기")]
상가업소번호 상호명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 시도명 시군구코드 ... 지번주소 도로명코드 도로명 건물본번지 건물관리번호 도로명주소 구우편번호 신우편번호 경도 위도
1917 23210677 평화드림여의도성모병원의료기매장 S 의료 S01 병원 S01B01 종합병원 서울특별시 11560.0 ... 서울특별시 영등포구 여의도동 62 115603118001 서울특별시 영등포구 63로 10 1156011000100620000031477 서울특별시 영등포구 63로 10 150713.0 7345.0 126.936693 37.518296

1 rows × 29 columns

df_seoul_hospital[df_seoul_hospital["상호명"].str.contains("꽃배달|의료기|장례식장|상담소|어린이집")]
상가업소번호 상호명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 시도명 시군구코드 ... 지번주소 도로명코드 도로명 건물본번지 건물관리번호 도로명주소 구우편번호 신우편번호 경도 위도
1917 23210677 평화드림여의도성모병원의료기매장 S 의료 S01 병원 S01B01 종합병원 서울특별시 11560.0 ... 서울특별시 영등포구 여의도동 62 115603118001 서울특별시 영등포구 63로 10 1156011000100620000031477 서울특별시 영등포구 63로 10 150713.0 7345.0 126.936693 37.518296
2803 20895655 서울성모병원장례식장꽃배달 S 의료 S01 병원 S01B01 종합병원 서울특별시 11650.0 ... 서울특별시 서초구 반포동 551 116504163330 서울특별시 서초구 사평대로28길 55 1165010700105510000017194 서울특별시 서초구 사평대로28길 55 137040.0 6578.0 127.000682 37.498257
4431 21781516 알콜중독및정신질환상담소 S 의료 S01 병원 S01B01 종합병원 서울특별시 11320.0 ... 서울특별시 도봉구 창동 181-52 113204127202 서울특별시 도봉구 마들로13길 153 1132010700101810052014414 서울특별시 도봉구 마들로13길 153 132040.0 1411.0 127.046203 37.657046
4644 22020310 강남성모병원장례식장꽃배달 S 의료 S01 병원 S01B01 종합병원 서울특별시 11650.0 ... 서울특별시 서초구 반포동 547-6 116504163242 서울특별시 서초구 반포대로39길 56 1165010700105470006016762 서울특별시 서초구 반포대로39길 56-24 137040.0 6578.0 127.001756 37.499095
7938 20625484 원자력병원장례식장 S 의료 S01 병원 S01B01 종합병원 서울특별시 11350.0 ... 서울특별시 노원구 공릉동 215-4 113503110002 서울특별시 노원구 노원로 75 1135010300102150004014400 서울특별시 노원구 노원로 75 139706.0 1812.0 127.082670 37.628808
10283 20024377 삼성의료원장례식장 S 의료 S01 병원 S01B01 종합병원 서울특별시 11680.0 ... 서울특별시 강남구 일원동 50 116803122009 서울특별시 강남구 일원로 81 1168011400100500000002609 서울특별시 강남구 일원로 81 135710.0 6351.0 127.089579 37.490334
47008 21738670 가톨릭대학교성바오로병원장례식장 S 의료 S01 병원 S01B01 종합병원 서울특별시 11230.0 ... 서울특별시 동대문구 전농동 620-56 112303105008 서울특별시 동대문구 왕산로 180 1123010400106200056027814 서울특별시 동대문구 왕산로 180 130709.0 2559.0 127.043471 37.579246
60645 27670796 서울성모병원어린이집 S 의료 S01 병원 S01B01 종합병원 서울특별시 11650.0 ... 서울특별시 서초구 반포동 505 116502121003 서울특별시 서초구 반포대로 222 1165010700101230000017226 서울특별시 서초구 반포대로 222 137701.0 6591.0 127.005841 37.502382
70177 11537223 한림대학교부속한강성심병원장례식장 S 의료 S01 병원 S01B01 종합병원 서울특별시 11560.0 ... 서울특별시 영등포구 영등포동7가 94-200 115604154428 서울특별시 영등포구 버드나루로7길 12 1156010800100940200033663 서울특별시 영등포구 버드나루로7길 12 150030.0 7247.0 126.909676 37.523168

9 rows × 29 columns

df_seoul_hospital[df_seoul_hospital["상호명"].str.contains("꽃배달|의료기|장례식장|상담소|어린이집")].index
Int64Index([1917, 2803, 4431, 4644, 7938, 10283, 47008, 60645, 70177], dtype='int64')
# 종합병원과 무관한 데이터를 전처리를 위해 해당 텍스트 한번에 검색
# 제거할 데이터의 인덱스만 drop_row에 담아주고 list 형태로 변환

drop_row = df_seoul_hospital[df_seoul_hospital["상호명"].str.contains("꽃배달|의료기|장례식장|상담소|어린이집")].index
drop_row = drop_row.tolist() 
drop_row
[1917, 2803, 4431, 4644, 7938, 10283, 47008, 60645, 70177]
# 의원으로 끝나는 데이터 인덱스 찾기
# drop_row2 에 담고 list 변환
# str.endswith() : ~로 끝나는거

drop_row2 = df_seoul_hospital[df_seoul_hospital["상호명"].str.endswith("의원")].index
drop_row2 = drop_row2.tolist()
drop_row2
[8479,
 12854,
 13715,
 14966,
 16091,
 18047,
 20200,
 20415,
 30706,
 32889,
 34459,
 34720,
 35696,
 37251,
 45120,
 49626,
 51575,
 55133,
 56320,
 56404,
 56688,
 57551,
 62113,
 76508]
# 삭제할 행을 drop_row에 합치기
drop_row = drop_row + drop_row2
len(drop_row)
33
# 해당 셀을 삭제하고 삭제 전 후의 행의 갯수 비교
print(df_seoul_hospital.shape)
df_seoul_hospital = df_seoul_hospital.drop(drop_row, axis=0)
print(df_seoul_hospital.shape)
(91, 29)
(58, 29)
# 시군구명에 따라 종합병원의 숫자
df_seoul_hospital["시군구명"].value_counts().plot.bar()

plt.figure(figsize=(15,4))
sns.countplot(data=df_seoul_hospital, x="시군구명", order=df_seoul_hospital["시군구명"].value_counts().index)

df_seoul_hospital["상호명"].unique()
array(['대진의료재단', '홍익병원별관', 'SNUH', '한양', '백산의료재단친구병원', '서울보훈병원',
       '서울대학교병원', '제일병원', '이랜드클리닉', '사랑나눔의료재단', '우울증센터', '성심의료재단',
       '다나의료재단', '서울아산병원신관', '고려대학교구로병원', '학교법인일송학원', '희명스포츠의학센터인공신장실',
       '연세대학교의과대학강남세브란스', '국립정신병원', '코아클리닉', '한국전력공사부속한일병원', '신촌연세병원',
       '영동세브란스병원', '삼성의료재단강북삼성태', '서울시립보라매병원', '서울대학교병원비상계획외래',
       '평화드림서울성모병원의료', '홍익병원', '사랑나눔의료재단서', '우신향병원', '동부제일병원', '아산재단금강병원',
       '명곡안연구소', '아산재단서울중앙병원', '메디힐특수여객', '삼성생명공익재단삼성서', '성광의료재단차병원',
       '한국건강관리협회서울특', '정해복지부설한신메디피아', '성베드로병원', '성애의료재단', 'Y&T성모마취과',
       '영남의료재단', '인제대학교서울백병원', '한국필의료재단', '사랑의병원', '성삼의료재단미즈메디병원',
       '씨엠충무병원', '원진재단부설녹색병원', '강남센트럴병원', '우리들병원', '건국대학교병원', '서울적십자병원',
       '서울성모병원응급의료센터', '가톨릭대학교여의도성모병원', '씨엠병원'], dtype=object)

특정 지역만 보기

# 서울에 있는 데이터의 위도와 경도 보기
# 결과를 df_seoul 이라는 df에 저장
# 새로운 변수에 데이터프레임 저장시 copy()를 사용

df_seoul= df[df["시도명"] == "서울특별시"].copy()
df_seoul.shape
(18943, 29)
# seaborn 의 countplot를 사용해 위에서 만든 데이터프레ㅣㅁ의 시군구명 시각화
df_seoul["시군구명"].value_counts().head()
df_seoul["시군구명"].value_counts().plot.bar(figsize=(10,4), rot=30)

plt.figure(figsize=(15,4))
sns.countplot(data=df_seoul, x="시군구명")
# x축 y축 두개 중 하나만 지정해주면 된다.

# pandas의 plot.scatter를 통해 경도와 위도 표시
df_seoul[["경도", "위도", "시군구명"]].plot.scatter()
# scatter는 x축과 y축이 꼭 들어가야 한다!!
TypeError: scatter() missing 2 required positional arguments: 'x' and 'y'
df_seoul[["경도", "위도", "시군구명"]].plot.scatter(x="경도", y="위도", figsize=(8,7), grid=True)

plt.figure(figsize=(9,8))
sns.scatterplot(data=df_seoul,x="경도", y="위도", hue="시군구명") 
# hue: 색상 다르게

plt.figure(figsize=(9,8))
sns.scatterplot(data=df_seoul,x="경도", y="위도", hue="상권업종중분류명") 

plt.figure(figsize=(16,12))
sns.scatterplot(data=df,x="경도", y="위도", hue="시도명") 

Folium으로 지도 활용

import folium
# 아나콘다에서 folium 별도 설치해야함
# conda install -c conda-forge folium
# 지도 시각화를 위한 라이브러리

m= folium.Map(location=[45.5236, -122.6750])
m
Make this Notebook Trusted to load map: File -> Trust Notebook
folium.Map()
# 세계 지도 출력! 
Make this Notebook Trusted to load map: File -> Trust Notebook
folium.Map()
# 지도의 중심을 지정하기 위해 위도와 경도의 평균을 구한다.

df_seoul_hospital["위도"].mean()
df_seoul_hospital["경도"].mean()
126.9963589356625
map = folium.Map(location=[df_seoul_hospital["위도"].mean(),df_seoul_hospital["경도"].mean()], zoom_start=12)
df_seoul_hospital.head(1)
상가업소번호 상호명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 시도명 시군구코드 ... 지번주소 도로명코드 도로명 건물본번지 건물관리번호 도로명주소 구우편번호 신우편번호 경도 위도
305 25155642 대진의료재단 S 의료 S01 병원 S01B01 종합병원 서울특별시 11215.0 ... 서울특별시 광진구 중곡동 58-25 112153104006 서울특별시 광진구 긴고랑로 119 1121510100100580025000733 서울특별시 광진구 긴고랑로 119 143220.0 4944.0 127.088279 37.559048

1 rows × 29 columns

for n in df_seoul_hospital.index:
    name = df_seoul_hospital.loc[n, "상호명"]
    address = df_seoul_hospital.loc[n, "도로명주소"]
    popup = f"{name}-{address}"
    location = [df_seoul_hospital.loc[n, "위도"], df_seoul_hospital.loc[n, "경도"]]
    folium.Marker(
        location = location,
        popup = popup,
    ).add_to(map)
map
Make this Notebook Trusted to load map: File -> Trust Notebook